home *** CD-ROM | disk | FTP | other *** search
/ User's Choice Windows CD / User's Choice Windows CD (CMS Software)(1993).iso / windows5 / wintidy.zip / WINPAS.ZIP / TIDYWINC.PAS < prev    next >
Pascal/Delphi Source File  |  1992-11-01  |  7KB  |  242 lines

  1. UNIT TidyWinC;
  2. (**) INTERFACE (**)
  3. USES WinTypes, WinProcs, Strings, Win31, TidyWinA, TidyWinB,
  4.   GroupType, GroupFWrite, {$IFNDEF VER70} WObjects;
  5.   {$ELSE} ODialogs, OWindows, Objects; {$ENDIF}
  6. TYPE
  7.   PTidyWindowC = ^TTidyWindowC;
  8.   TTidyWindowC = OBJECT(TTidyWindowB)
  9.     Reloading : Boolean;
  10.     CONSTRUCTOR Init(AParent : PWindowsObject; AName : PChar);
  11.     PROCEDURE RestoreLayout;
  12.     PROCEDURE Converse; Virtual;
  13.     PROCEDURE wmDDEAck(VAR Msg : TMessage); Virtual
  14.       wm_First + wm_DDE_Ack;
  15.     FUNCTION LocateFromINI(IsGroup : Boolean; H : HWnd) : Boolean;
  16.     PROCEDURE RestoreGroupWindows;
  17.   END;
  18.  
  19. (**) IMPLEMENTATION (**)
  20.   CONSTRUCTOR TTidyWindowC.Init(AParent : PWindowsObject;
  21.     AName : PChar);
  22.   BEGIN
  23.     TTidyWindowB.Init(AParent, AName);
  24.     Reloading := FALSE;
  25.   END;
  26.  
  27.   PROCEDURE TTidyWindowC.RestoreLayout;
  28.   CONST
  29.     GroupX : PChar = 'GROUPxx';
  30.     gBSize = 80;
  31.   VAR
  32.     GroupNum, HwndNum,
  33.     ItemNum             : Word;
  34.     GroupBuf, GpNameBuf : ARRAY[0..gBSize] OF Char;
  35.     TGF                 : TGroupFilw;
  36.     TWP                 : TWindowPlacement;
  37.     TID                 : TItemData;
  38.  
  39.     FUNCTION UpdateItem : Boolean;
  40.     CONST
  41.       nBSize = 80;
  42.       pBSize = 14;
  43.     VAR
  44.       ItemNameBuf : ARRAY[0..nBSize] OF Char;
  45.       PosnBuf     : ARRAY[0..pBSize] OF Char;
  46.       Px,Py       : PChar;
  47.       vX,vY,Code  : Integer;
  48.       L           : LongInt;
  49.     BEGIN
  50.       UpdateItem := FALSE;
  51.       TGF.PCharFmOffset(TID.pName, ItemNameBuf, nBSize);
  52.       GetPrivateProfileString(gpNameBuf, ItemNameBuf, '', PosnBuf,
  53.         pBSize, IniName);
  54.       IF PosnBuf[0] <> #0 THEN
  55.         BEGIN
  56.           Px := PosnBuf;
  57.           Py := StrScan(PosnBuf,',') + 1;
  58.           Px[Py-Px-1] := #0;
  59.           Val(Px, L, Code);
  60.           IF Code <> 0 THEN Exit;
  61.           IF (L < -32768) OR (L > 32767) THEN Exit;
  62.           vX := L;
  63.           Val(Py, L, Code);
  64.           IF Code <> 0 THEN Exit;
  65.           IF (L < -32768) OR (L > 32767) THEN Exit;
  66.           vY := L;
  67.           WITH TID.Pt DO
  68.             IF (X <> vX) OR (Y <> vY) THEN
  69.               BEGIN
  70.                 UpdateItem := TRUE;
  71.                 X := vX; Y := vY;
  72.               END;
  73.         END;
  74.     END;
  75.  
  76.   BEGIN
  77.     IF pmWindow = 0 THEN Exit;
  78.     OldCur := SetCursor(LoadCursor(0, idc_Wait));
  79.     SetCapture(hWindow);
  80.       {restore ProgMan's size and position}
  81.     IF NOT LocateFromIni(FALSE, PMWindow) THEN Exit;
  82.       {restore item positions in GRP files}
  83.     ShowWindow(PMWindow, sw_Hide);
  84.     FOR GroupNum := 1 TO MaxGroups DO
  85.       BEGIN
  86.         wvsprintf(Groupx, 'Group%u', GroupNum);
  87.         GetPrivateProfileString('Groups', Groupx, '', GroupBuf,
  88.           gBSize, 'PROGMAN.INI');
  89.         IF GroupBuf[0] <> #0 THEN
  90.           BEGIN
  91.             TGF.Init(GroupBuf);
  92.             TGF.fpName(gpNameBuf, gBSize);
  93.             FOR ItemNum := 0 TO TGF.fcItems-1 DO
  94.               IF TGF.GetNthItem(ItemNum, TID) THEN
  95.                 IF UpdateItem THEN
  96.                   TGF.WriteNthItem(ItemNum, TID);
  97.             TGF.Done;
  98.           END;
  99.       END;
  100.       {initiate DDE conversation with ProgMan}
  101.     Reloading := TRUE;
  102.     InitDDEConversation;
  103.   END;
  104.  
  105.   FUNCTION TTidyWindowC.LocateFromINI(IsGroup : Boolean; H : HWnd) :
  106.     Boolean;
  107.   CONST
  108.     nBSize = 80;
  109.     tBSize = 60; 
  110.   VAR
  111.     TWP     : TWindowPlacement;
  112.     IniBuf  : ARRAY[0..tBSize] OF Char;
  113.     NameBuf : ARRAY[0..nBSize] OF Char;
  114.     Sect, P : PChar;
  115.     N       : Word;
  116.  
  117.     FUNCTION TWPfmPChar(VAR T : TWindowPlacement; Src : PChar) :
  118.       Boolean;
  119.     VAR
  120.       Pw, PNext : PChar;
  121.       N, Code   : Integer;
  122.       L         : LongInt;
  123.       Words     : ARRAY[0..9] OF Word;
  124.     BEGIN
  125.       TWPfmPChar := FALSE;
  126.       Pw := Src;
  127.       FOR N := 0 TO 9 DO
  128.         BEGIN
  129.           PNext := Pw;
  130.           WHILE NOT (PNext[0] IN [',',';',#0]) DO PNext := PNext+1; 
  131.           IF PNext[0] <> #0 THEN
  132.             BEGIN
  133.               PNext[0] := #0;
  134.               PNext := PNext + 1;
  135.             END;
  136.           Val(Pw, L, Code);
  137.           IF Code <> 0 THEN Exit;
  138.           IF (L < 0) OR (L > 65535) THEN Exit;
  139.           Words[N] := Word(L);
  140.           Pw := PNext;
  141.         END;
  142.       Move(Words, T.Flags, SizeOf(Words));
  143.       T.length := 22;
  144.       TWPfmPChar := TRUE;
  145.     END;
  146.  
  147.   BEGIN
  148.     LocateFromINI := FALSE;
  149.     IF IsGroup THEN
  150.       BEGIN
  151.         GetWindowText(H, NameBuf, nBSize);
  152.         Sect := GroupSect;
  153.       END
  154.     ELSE
  155.       BEGIN
  156.         StrCopy(NameBuf, 'Placement');
  157.         Sect := ProgmanSect;
  158.       END;
  159.     GetPrivateProfileString(Sect, NameBuf, '', IniBuf, tBSize,
  160.       IniName);
  161.     IF IniBuf[0] = #0 THEN
  162.       BEGIN
  163.         IF NOT Quiet THEN MessageBeep(mb_IconInformation);
  164.         IF IsGroup THEN
  165.           MessageBox(hWindow, 'Group was added since last Save Layout',
  166.             NameBuf, mb_Ok + mb_IconInformation)
  167.         ELSE MessageBox(hWindow, 'INI file absent or corrupted',
  168.           IniName, mb_Ok + mb_IconInformation);
  169.       END
  170.     ELSE IF TWPfmPChar(TWP, IniBuf) THEN
  171.       BEGIN
  172.         LocateFromINI := TRUE;
  173.         IF IsGroup THEN
  174.           TWP.Flags := TWP.Flags OR wpf_SetMinPosition;
  175.         SetWindowPlacement(H, @TWP);
  176.       END;
  177.   END;
  178.  
  179.   PROCEDURE TTidyWindowC.Converse;
  180.     {if Reloading from INI file, send a Reload command to ProgMan.
  181.      Otherwise, let the default behavior of TTidyWindowB happen.}
  182.   CONST ReloadCmd = '[Reload]';
  183.   VAR
  184.     PMcmdH : THandle;
  185.     PMcmdP : PChar;
  186.   BEGIN
  187.     IF Reloading THEN
  188.       BEGIN
  189.         PMcmdH := GlobalAlloc(gmem_Moveable OR gmem_DDEShare,
  190.           StrLen(ReloadCmd));
  191.         PMcmdP := GlobalLock(PMcmdH);
  192.         StrCopy(PMcmdP, ReloadCmd);
  193.         GlobalUnlock(PMcmdH);
  194.         IF NOT PostMessage(PMWindow, wm_DDE_Execute,
  195.           hWindow, MakeLong(0, PMcmdH)) THEN
  196.             GlobalFree(PMcmdH);
  197.       END
  198.     ELSE TTidyWindowB.Converse;
  199.   END;
  200.  
  201.   PROCEDURE TTidyWindowC.wmDDEAck(VAR Msg : TMessage);
  202.     {If not Reloading from INI file, let TTidyWindowB handle it.
  203.      Otherwise, let TTidyWindowB handle the FIRST Ack, and take
  204.      the next as a signal to END the conversation}
  205.   BEGIN
  206.     IF NOT Reloading THEN TTidyWindowB.wmDDEAck(Msg)
  207.     ELSE IF NOT LinkedToPM THEN TTidyWindowB.wmDDEAck(Msg)
  208.     ELSE
  209.       BEGIN
  210.         GlobalDeleteAtom(Msg.lParamHi);
  211.         Reloading := FALSE;
  212.         IF Msg.LParamLo AND dde_Ack <> dde_Ack THEN
  213.           BEGIN
  214.             IF NOT Quiet THEN MessageBeep(mb_IconStop);
  215.             MessageBox(hWindow, 'Program Manager does not'+
  216.               ' acknowledge command', 'ERROR',
  217.               mb_Ok + mb_IconStop);
  218.             SetCursor(OldCur);
  219.             ReleaseCapture;
  220.           END
  221.         ELSE
  222.           BEGIN
  223.             PostMessage(PMWindow, wm_DDE_Terminate, hWindow, 0);
  224.             RestoreGroupWindows;
  225.           END;
  226.       END;
  227.   END;
  228.  
  229.   PROCEDURE TTidyWindowC.RestoreGroupWindows;
  230.   VAR M : Word;
  231.   BEGIN
  232.     GetGroupHandles;
  233.     FOR M := 1 TO THA[0] DO LocateFromINI(TRUE, THA[M]);
  234.     ShowWindow(PMWindow, sw_Show);
  235.     IF NOT Quiet THEN MessageBeep(mb_IconInformation);
  236.     MessageBox(hWindow, 'Layout has been restored from INI file',
  237.       IniName, mb_Ok + mb_IconInformation);
  238.     SetCursor(OldCur);
  239.     ReleaseCapture;
  240.   END;
  241. END.
  242.